<?php
/**
*Clase que manipula las prestaciones
*
*Esta clase agrega, modifica articulos e informa las prestaciones
*
*@author gush
*@author pegudo
*@package controller
*/

Class PrestacionsController extends AppController { 
	var $name = 'Prestacions';
	var $helpers = array('Html', 'Javascript', 'Ajax'); 
	
	function index(){
		
		$this->setearSubMenu();
		//Primer dia mes anterior.
		$sFecha_inicial = date('d-m-Y', mktime(0,0,0,date('m')-1, 01, date('Y'))); //date('d-m-Y');
		//Ultimo dia mes actual.
		
		$sFecha_final = $this->ultimoDia(date('d-m-Y'));
		
		$this->set('sFecha_inicial',$sFecha_inicial);
		$this->set('sFecha_final',$sFecha_final);
	}
	
	/** 
	*Esta funcion devuelve los ingresos y egresos de cajas de un cliente.
	*@return array
	*@param integer $idCliente id del cliente del cual necesita saber el informe
	*@param integer $idServicio id del servicio con el cual se corresponde la consulta
	*@param date $fechaDesde fecha inicial de la consulta
	*@param date $fechaDesde fecha final de la consulta
	*/
	function getClienteInforme($idCliente,$idServicio,$fechaDesde=null,$fechaHasta=null)
	{
		//se filtra por el id del cliente, el servicio y en caso de haberlas, las fechas
		$filtroFecha = "";
		if($fechaDesde!=null)
			$filtroFecha = "and(Prestacion.fecha_inicio>=$fechaDesde)";
		if($fechaHasta!=null)
			$filtroFecha .= "and(Prestacion.fecha_inicio<=$fechaDesde)";
		
		//las condiciones del id cliente y del id servicio
		$conditions="(Prestacion.clientes_id = $idCliente)and(Prestacion.servicios_id = $idServicio)";
		//desactivo la relacion con servicio
		$this->Prestacion->unBindModel(array("belongsTo"=>array("Servicio")));
		$prestaciones=$this->Prestacion->findAll($conditions);
		return $prestaciones;
	}

	/**
	 * Funcion que devuelve en un arreglo la cantidad de altas y bajas de las cajas custodiadas de un cliente.
	 * @return array relacional => array('altas'=>$sumatoriaAltas,'bajas'=>$sumatoriaBajas)
	 * @param $iIdCliente integer
	 * @param $dFechaDesde date "Y-m-d"
	 * @param $dFechaHasta date "Y-m-d"
	 */
	function getCantCajasCustodiadas($iIdCliente,$dFechaDesde,$dFechaHasta){
		
		$idCustodia = 2;
		$idExpurgue = 3;
		
		//filtros
		$filtroFecha = "(Prestacion.fecha_inicio >= '$dFechaDesde')AND(Prestacion.fecha_fin <= '$dFechaHasta')";
		if($iIdCliente!=null)
			$filtroCliente = "AND(Prestacion.clientes_id = $iIdCliente)";
		else
			$filtroCliente = "";
		$filtroServicio = "AND(Prestacion.precio <> 0)AND(Prestacion.servicios_id = $idCustodia OR Prestacion.servicios_id = $idExpurgue)";
		$filtro = $filtroFecha.$filtroServicio.$filtroCliente;
		
		//desactivo la relacion con servicio
		$this->Prestacion->unBindModel(array("belongsTo"=>array("Servicio")));
		$prestaciones=$this->Prestacion->findAll($filtro);
		
		//se realiza las sumas de los articulos concluyendo con cuantos articulos posee el cliente
		$sumatoriaBajas=0;
		$sumatoriaAltas=0;
		foreach($prestaciones as $reg)
		{
			if($reg['Prestacion']['servicios_id']==$idExpurgue)//hay que restar al total
				$sumatoriaBajas += $reg['Prestacion']['cantidad'];
			else
				$sumatoriaAltas += $reg['Prestacion']['cantidad'];//sino hay q sumar
		}
		//esto es opcional ver si va o no
		$arreglo = array('altas'=>$sumatoriaAltas,'bajas'=>$sumatoriaBajas);
		return $arreglo;
	}

	/**
	*Funcion que calcula y devuelve el valor en dinero de los servicios brindados a un cliente
	*
	*Esta funcion calcula el inicio de una prestacion y calcula cuanto deberia pagarse 
	*por ella hasta el mes indicado.
	*@return float, si es -1 significa que alguno de los meses no estan cerrados sino devuelve el valor que debe pagarse por las prestaciones
	*@param integer $idCliente id del cliente del cual se calcula el monto
	*@param integer $fechaActual
	*
	*/
	function getTotalPrestacion($idCliente,$fechaActual=null,$fPrecioTmp)
	{
		$idExpurgue = 3;//ESTO DEBE CAMBIAR, DEBE SER UNA VAR DE SISTEMA
		$idCustodia = 2;
		$sumatoriaTotal = 0; //Var del Total
		
		$fechaIniContrato = $this->requestAction("clientes/getFechaInicioContrato/$idCliente");
 		$fechaFinContrato = $this->requestAction("clientes/getFechaFinContrato/$idCliente");

		//consulto si hasta el mes que se quiere facturar tiene todos los meses cerrados
		//$facturar = $this->requestAction("historialprecios/mesCerrado/$idCliente/$fechaActual/");
		//if(!$facturar){
			//echo 'no todos meses cerrados';
			//return -1;
		//}
		
		//Si la fecha actual esta en el rango de inicio y fin contrato.
		if ($fechaIniContrato < $fechaActual && $fechaActual <= $fechaFinContrato) {		
			
			//Condiciones comunes para unica vez y mensual.
			$filtrarFecha = "AND('$fechaIniContrato' < Prestacion.fecha_inicio) AND(Prestacion.fecha_inicio < '$fechaActual')";
			
			if($fechaActual!=null){
				$var=explode('-',$fechaActual);
				//asigno el mes actual de la fecha actual
				$mesActual=$var[1];
			}
	
			//Inicio Prestaciones de una sola vez -----------------------------------------------------------------
			$filtrarFecUnicaVez = $filtrarFecha. "AND(Prestacion.fecha_inicio=Prestacion.fecha_fin)";
			$conditions = "(Prestacion.clientes_id = $idCliente)$filtrarFecUnicaVez";
			//echo "$conditions";
			$prestaciones = $this->Prestacion->findAll($conditions);
			
			//sumatoria de los montos de las prestaciones por unica vez
			foreach($prestaciones as $reg){
				$precio = $reg['Prestacion']['precio'];
				$cantidad = $reg['Prestacion']['cantidad'];
				$sumatoriaTotal += $precio * $cantidad;
			}
			
			//Fin Prestaciones de una sola vez -----------------------------------------------------------------
		
			//Inicio de Prestaciones Mensuales -----------------------------------------------------------------
			//prestaciones que no son ni custodias ni expurgues
			//Calculo de dias proporcionales
			
			//FILTRO por fecha para saber lo que se debe pagar hasta esa fecha
			$filtrarFecPrestMensuales = $filtrarFecha."AND((DATE_ADD(Prestacion.fecha_fin, INTERVAL 1 MONTH)) >= '$fechaActual') AND(Prestacion.fecha_inicio!=Prestacion.fecha_fin)";
			$noCustodias = " AND (Prestacion.servicios_id <> $idExpurgue ) AND (Prestacion.servicios_id <> $idCustodia )";

			//limito la fecha al rango de las fechas inicio y fin del contrato actual
			$conditions="(Prestacion.clientes_id = $idCliente) $filtrarFecPrestMensuales $noCustodias";

			$prestaciones=$this->Prestacion->findAll($conditions);
			//se realiza la suma de lo que valen las prestaciones hasta esa fecha
			
			foreach($prestaciones as $reg)
			{
				//transforma en arreglo las fechas
				$fechaFin=explode('-',$reg['Prestacion']['fecha_fin']);
				$fechaInicio=explode('-',$reg['Prestacion']['fecha_inicio']);
			
				//obtiene el precio, se deberia usar getPrecioPrestacion($idPrestacion,$mes)
				$precio = $reg['Prestacion']['precio'];
				
				//cantidad de la prestacion
				$cantidad = $reg['Prestacion']['cantidad'];
				
				//CALCULA EL PRIMER MES DE LA PRESTACION
				$mesPrestacion = $fechaInicio[1];//mes inicio de la prestacion
				$diaPrestacion = $fechaInicio[2];//dia inicio de la prestacion
				$anioPrestacion = $fechaInicio[0];//anio inicio de la prestacion
	
				$cantDiasPrimerMes = cal_days_in_month(CAL_GREGORIAN,$mesPrestacion,$anioPrestacion);
				/*la cantidad de dias 	del primer mes*/
				
				if($diaPrestacion==1)
					$precioDia = $precio;
				else
				{
					//dias que deben cobrarse
					$diasCobrados = $cantDiasPrimerMes - $diaPrestacion + 1;
					//calcula el precio del primer mes por dia si es q empezo despues del 1
					$precioDia = $precio/ $cantDiasPrimerMes * $diasCobrados;
				}
				
				//si es un expurgue tiene que restar lo que agrega.
				if($reg['Prestacion']['servicios_id']==$idExpurgue) $precioDia *= -1;
				
				$sumatoriaTotal += $precioDia * $cantidad;
				
				//suma el valor
				//CALCULA EL RESTO DE LOS MESES HASTA EL MES ACTUAL
				if($mesPrestacion!=$mesActual)//debe calcular hasta el mes actual
				{
					//si el mes siguiente es 13 lo setea en 1
					$mesPrestacion+=1;
					//pr('mes prestacion sig: '.$mesPrestacion.' mes actual: '.$mesActual);
					
					if(($mesPrestacion)==13)
						$mesPrestacion=1;
					
					//suma el monto de todos los meses hasta llegar al mes actual
					for($mes = $mesPrestacion; $mes <= $mesActual; $mes++) {
							$sumatoriaTotal += $precio * $cantidad ;
					}
				}		
			}
		}
		
		//obtiene lo que debe por las cajas custodiadas
		$precioCustodias = $this->getTotalCustodias($idCliente,$fechaActual,$fPrecioTmp);
		$precioCustodias = $this->redondear($precioCustodias);
		$sumatoriaTotal += $precioCustodias;
		return $sumatoriaTotal;
	}
	
	/**
	*Funcion que calcula y devuelve el valor de las custodias de un cliente
	*
	*@return float
	*@param integer $idCliente id del cliente del cual se calcula el monto
	*@param integer $fechaActual 
	*@param float   $fPrecio es un supuesto precio para aquellos meses q no esten cerrados
	*
	*/
	function getTotalCustodias($idCliente,$fechaActual=null,$fPrecioTmp=null)
	{
		$idExpurgue = 3;//ESTO DEBE CAMBIAR, DEBE SER UNA VAR DE SISTEMA
		$idCustodia = 2;
		$sumatoriaTotal = 0; //Var del Total
		
		$fechaIniContrato = $this->requestAction("clientes/getFechaInicioContrato/$idCliente");
 		$fechaFinContrato = $this->requestAction("clientes/getFechaFinContrato/$idCliente");

		//Si la fecha actual esta en el rango de inicio y fin contrato.
		if ($fechaIniContrato < $fechaActual && $fechaActual <= $fechaFinContrato) {
			
			//Condiciones comunes para unica vez y mensual.
			$filtrarFecha = "AND($fechaIniContrato <= Prestacion.fecha_inicio) AND(Prestacion.fecha_fin <= '$fechaActual')";
			
			if($fechaActual!=null){
				$var=explode('-',$fechaActual);
				//asigno el mes actual de la fecha actual
				$mesActual=$var[1];
			}
		
			//FILTRO por fecha --> ver bien 
			$filtrarFecPrestMensuales = $filtrarFecha;//."AND(Prestacion.fecha_inicio!=Prestacion.fecha_fin)";
			$Custodias = " AND ((Prestacion.servicios_id = $idCustodia) OR (Prestacion.servicios_id = $idExpurgue))";

			//limito la fecha al rango de las fechas inicio y fin del contrato actual
			$conditions="(Prestacion.clientes_id = $idCliente)$filtrarFecPrestMensuales $Custodias ORDER BY Prestacion.fecha_inicio";
			$prestaciones=$this->Prestacion->findAll($conditions);
			
			//------ si existe meses sin cerrar y si el precio sugerido no es cero, se calcula cuanto es la deuda futura
			//echo $fPrecioTmp;
			//se fija que todas las fechas esten cerradas, si no es asi agrega las prestaciones que faltan al arreglo
			if($fPrecioTmp!=0){
				//$sFechaActual = date('Y-m-d');
				$facturar = $this->requestAction("historialprecios/mesCerrado/$idCliente/$fechaActual/");
				if(!$facturar){
					$dUltimoMes = $this->requestAction("historialprecios/getUltimoMesCerrado/$idCliente");
					$dIniContrato = $this->requestAction("clientes/getFechaInicioContrato/$idCliente/");
					//echo '<br />';
					//echo $dIniContrato;
					//echo '<br />';
					$prest = $this->requestAction("prestacions/getCantCajasCustodiadas/$idCliente/$dIniContrato/$dUltimoMes/");
					//pr($prest);
					$iCantCajas = $prest['altas'] - $prest['bajas'];
					//echo $iCantCajas;
					//echo '<br />';
					//echo "----->   $dUltimoMes  <------";
					//echo '<br />';
					//$dNextMonth = $this->ultimoDia($this->agregarMes($dUltimoMes));
					//echo "mes siguiente $dNextMonth <br />";					
					//$dNextMonth = $this->ultimoDia($this->agregarMes($dNextMonth));
					//echo "mes siguiente $dNextMonth <br />";
					$dias = $this->diferenciaDias($dUltimoMes,date('Y-m-d'));
					
					
					$iCantMeses = abs(round($dias / 30));//cantidad de meses que deben cerrarse
					//echo $dias.'dias   '.$iCantMeses.'meses';
					//echo '<br />';
					$tam = sizeof($prestaciones);
					//echo $tam;
					//echo '<br />';
					//echo '<br />';
					
					$dUltimoMes = $this->ultimoDia($this->agregarMes($dUltimoMes));
					for($i=0;$i<$iCantMeses-1;$i++){

						$dNextMonth = $this->ultimoDia($this->agregarMes($dUltimoMes));
						//echo '-----------------------------------'.$dNextMonth;
						$aTmp = explode('-',$dNextMonth);

						$dFirstDay = date("Y-m-d", mktime(0,0,0,$aTmp[1],1,$aTmp[0]));
						
						$prestaciones[] = array(
							'Prestacion' => Array
							(
								'fecha_inicio' => "$dFirstDay",
								'fecha_fin' => "$dNextMonth",
								'cantidad' => "$iCantCajas",
								'servicios_id' => '2'
							)
        				);
						$dUltimoMes = $dNextMonth;
					}
				}
			}
			
			//------
			//pr($prestaciones);
			//se realiza la suma de lo que valen las prestaciones hasta esa fecha
			foreach($prestaciones as $reg){
				//transforma en arreglo las fechas
				$fechaFin=explode('-',$reg['Prestacion']['fecha_fin']);
				$fechaInicio=explode('-',$reg['Prestacion']['fecha_inicio']);
				
				//cantidad de la prestacion
				$cantidad = $reg['Prestacion']['cantidad'];
				
				//para calcular cuantos dias hay q pagar hasta fin de mes
				$mesPrestacion = $fechaInicio[1];
				$diaPrestacion = $fechaInicio[2];
				$anioPrestacion = $fechaInicio[0];
	
				$fecha = "$anioPrestacion-$mesPrestacion-$diaPrestacion";
				$precio = $this->getPrecioCustodia($fecha,$idCliente,$fPrecioTmp);				

				$cantDiasPrimerMes = cal_days_in_month(CAL_GREGORIAN,$mesPrestacion,$anioPrestacion);
				/*la cantidad de dias 	de la prestacion*/
				
				if($diaPrestacion==1){
					$precioDia = $precio;
				}
				else{
					$diasCobrados = $cantDiasPrimerMes - $diaPrestacion + 1; //dias que deben cobrarse
					$precioDia = $precio/ $cantDiasPrimerMes * $diasCobrados; //precio por dia por los dias a cobrar
				}
				
				//si es un expurgue tiene que restar lo que agrega.
				if($reg['Prestacion']['servicios_id']==$idExpurgue) $precioDia *= -1;
				$sumatoriaTotal += $precioDia * $cantidad;
			}
		}
		$sumatoriaTotal = $this->redondear($sumatoriaTotal);
		return $sumatoriaTotal;
	}
	
	/**
	 * Retorna el precio de una custodia en un mes especifico ya que este precio es variable mes a mes
	 * @param 	$dFecha date fecha del mes al cual el preci pertenece
	 * @param	$iIdCliente
	 * @param	$fPrecioTmp precio a utilizar si no existe un precio  para dicho mes.
	 * @return	float
	 */
	function getPrecioCustodia($dFecha,$iIdCliente,$fPrecioTmp=null){
		$fPrecio = $this->requestAction("historialprecios/getPrecio/$iIdCliente/$dFecha/");
		if($fPrecio==null){
			$fPrecio = $fPrecioTmp;
		}
		return $fPrecio;
	}
	
	/**
	*Lista las ultimas prestaciones agregadas
	*/

	//genera una lista de los servicios que empieza con $nombre
	function listarPrestaciones($aCrit=null)
	{
		//Limita la cantidad de resultados a devolver
		$iLimiteInic=($aCrit==null)?0:$aCrit['iLimiteIni'];
		$iLimiteFin=($aCrit==null)?10:$aCrit['iLimiteFin'];
		$orderBy = ($aCrit==null)? 'order by p.id desc' : 'order by p.fecha_inicio desc, p.id desc';
		$where = "where p.precio <> 0 ";
	
		//Busca por fecha inicial
		$sFechaInicial = (isset($aCrit['sFechaInicial']))?$this->convertDmyToYmd($aCrit['sFechaInicial']):"";
		$where.=(isset($aCrit['sFechaInicial']))?(($where == "")? "where ": " and ")."p.fecha_inicio >='$sFechaInicial'" :"";
		//Busca por fecha final
		$sFechaFinal = (isset($aCrit['sFechaFinal']))?$this->convertDmyToYmd($aCrit['sFechaFinal']):"";
		$where.=(isset($aCrit['sFechaFinal']))?(($where == "")? "where ": " and ")."p.fecha_fin <= '$sFechaFinal' " :"";
		//Busca por id de Cliente
		$where.=(isset($aCrit['iIdCliente']))? (($where == "")? "where ": " and ")."c.id = ". $aCrit['iIdCliente']:"";
		//Busca por id de servicio.
		$where.=(isset($aCrit['iIdServicio']))? (($where == "")? "where ": " and ")."s.id = ". $aCrit['iIdServicio']:"";
		//Busca por nombre de cliente.
		$where.=(isset($aCrit['sCliente']))? (($where == "")? "where ": " and ")." c.nombre like '".$aCrit['sCliente']."%'":"";
		//Busca por nombre de servicio.		
		$where.=(isset($aCrit['sServicio']))? (($where == "")? "where ": " and ")." s.nombre like '".$aCrit['sServicio']."%'":"";

		$sSql = "select p.* , c.id, c.nombre, s.id, s.nombre
				from prestacions p
				left join clientes c on c.id = p.clientes_id
				left join servicios s on s.id = p.servicios_id
				$where
				$orderBy
				limit $iLimiteInic,$iLimiteFin
			   ";
		$aResultado = $this->Prestacion->query($sSql);
		//pr($sSql);
		//echo($resultado);
		return($aResultado);
	}


	
	function getPrestaciones() {
		$aCrit = $_POST;
				
		$aPrestaciones = (empty($aCrit))? $this->listarPrestaciones():$this->listarPrestaciones($aCrit);
		$sFilas='';
		$n = sizeof($aPrestaciones);
		if ($n>0) {
			$sFilas="[";
		}
		for($i=0; $i<$n; $i++)
		{
			//creamos la tabla de datos de ingresos
			$gd_id=				"id:\""				.$aPrestaciones[$i]['p']['id']										. "\"";
			$gd_fecha_inicio=	"fecha_inicio:\""	.$this->convertDmyToYmd($aPrestaciones[$i]['p']['fecha_inicio'])	. "\"";
			$gd_cantidad=		"cantidad:\""		.$aPrestaciones[$i]['p']['cantidad']								. "\"";
			$gd_precio=			"precio:\""			.'$ '.$aPrestaciones[$i]['p']['precio']								. "\"";
			$gd_id_servicio=	"id_servicio:\""	.$aPrestaciones[$i]['s']['id']										. "\"";			
			$gd_servicio=		"servicio:\""		.$aPrestaciones[$i]['s']['nombre']									. "\"";
			$gd_id_cliente=		"id_cliente:\""		.$aPrestaciones[$i]['c']['id']									. "\"";
			$gd_cliente=		"cliente:\""		.$aPrestaciones[$i]['c']['nombre']									. "\"";


			($i<sizeof($aPrestaciones)-1)?$sDelimitador = ',':$sDelimitador = ']';
			$sFilas .= "{" 	. $gd_id 				. "," 
							. $gd_fecha_inicio 	. "," 
							. $gd_cantidad		. "," 
							. $gd_precio		. "," 
							. $gd_id_servicio	. "," 
							. $gd_servicio 		. "," 
							. $gd_id_cliente	. "," 
							. $gd_cliente 		. 
						"}" 
							. $sDelimitador . "\n";
			
		}
//		pr($sFilas);
		$this->layout = false;
		echo $sFilas;
	}

	
	
/**
*Funcion que agrega una prestacion
*
*@return null
*@param null
*/	
	function add(){
		//setea el submenu
		$this->setearSubMenu();
		$this->set('status', '');
	
		//variables del sistema
		$idCustodia = 2;
		$idExpurgue = 3;
		
		//setea los clientes
		$clientes = $this->requestAction('/clientes/seleccionarClientes');
		$this->set('clientes',$clientes);
		
		//setea los servicios brindados
		$serviciosBrindados = $this->requestAction('/serviciobrindados/listarServicios/0/true');
		$this->set('serviciosBrindados',$serviciosBrindados);		
		
		//setea los servicios brindados por unica vez
		$serviciosBrindadosPUV = $this->requestAction('/serviciobrindados/seleccionarServiciosBrindadosPUV');
		
		//obtener los precios de los servicios brindados
		$serviciosPrecios = $this->requestAction('/serviciobrindados/seleccionarServiciosPrecios');
		$this->set('serviciosPrecios', $serviciosPrecios);

		//obtener servicios sin precios
		$archivoini=parse_ini_file(PATH_CONFIG_INI,true);
		$this->set('aServiciosSinPrecios', explode(',',$archivoini['Servicios']['serviciosSinPrecios']));

		//Si los campos no estan vacios
		if(!empty($this->data['Prestacion']['cantidad']))
		{
			//se setea el precio en 1 xq es un servicio sin precio, Ej custodia, expurgue
			if(!isset($this->data['Prestacion']['precio']))
				$this->data['Prestacion']['precio'] = 1;
			
			//Se hizo esta comparacion ya que empty() considera al 0 como vacio
			$idCliente = $this->data['Prestacion']['clientes_id'];
			
			//se chequea si el servicio seleccionado es por unica vez
			$porUnicaVez=false;
			foreach ($serviciosBrindadosPUV as $key => $value) 
			{
				if ($key == $this->data['Prestacion']['servicios_id']) 
				{
					$porUnicaVez=true;
				}
			}

			//si la fecha de la prestacion pertenece a un mes cerrado da ERROR
			$hoy = $this->data['Cuenta']['fecha'];
			$dFecha = $this->convertDmyToYmd($hoy);
			$iMesCerrado = $this->requestAction("historialprecios/mesCerrado/$idCliente/$dFecha/");

			//si el mes ya esta cerrado: sale y no hace nada
			if($iMesCerrado){
				$this->set('status','Error: La fecha pertenece a un mes cerrado.');
				$this->data = "";
				//$prestaciones = $this->listarUltimas(10);
				//$this->set('aPrestaciones',$prestaciones);
				$this->render('add', 'ajax');
				exit;
			}
			
			//la fecha no puede ser mayor que la fecha fin contrato
			$dFechaFinContrato = $this->requestAction("clientes/getFechaFinContrato/$idCliente");
			$iPerteneceContrato = $dFecha < $dFechaFinContrato;
			if(!$iPerteneceContrato){
				$this->set('status','Error: La fecha de la prestacion no puede ser posterior a la fecha de finalización del contrato.');
				$this->data = "";
//				$prestaciones = $this->listarUltimas(10);
//				$this->set('aPrestaciones',$prestaciones);
				$this->render('add', 'ajax');
				exit;
			}
			
			//tampoco menor que la fecha inicio contrato
			$dFechaInicioContrato = $this->requestAction("clientes/getFechaInicioContrato/$idCliente");
			$iPerteneceContrato = $dFecha >= $dFechaInicioContrato;
			if(!$iPerteneceContrato){
				$this->set('status','Error: La fecha de la prestacion no puede ser anterior a la fecha de inicializacion del contrato.');
				$this->data = "";
//				$prestaciones = $this->listarUltimas(10);
//				$this->set('aPrestaciones',$prestaciones);
				$this->render('add', 'ajax');
				exit;
			}

			//aqui controlara si los articulos que dependen del servicio estan disponibles
			//si $admitido es true entonces existe disponibilidad de todos los articulos
			$cantidad = $this->data['Prestacion']['cantidad'];
			$idServicio = $this->data['Prestacion']['servicios_id'];
			$admitido = $this->requestAction("articulos/disponibleStock/$idServicio/$cantidad/");
			
			//se puede expurgar un articulo
			$permitidoExpurgue = $this->requestAction("articulos/disponibleExpurgueCajas/$idServicio/$idCliente/$cantidad/");
			
			//valida los campos de la prestacion
			$this->Prestacion->data = $this->data;
			if($this->Prestacion->validates() && $admitido && $permitidoExpurgue){
				$hoy = $this->convertDmyToYmd($hoy);//convierte la disposicion de la fecha
				if($porUnicaVez) {
					$fechaFin = $hoy;
				}
				else {
					//si es expurgue o custodia coloca el ultimo dia del mes, sino la fecha fin de contrato
					if($idServicio==$idCustodia || $idServicio==$idExpurgue){
						
						//obtengo la ultima fecha del mes
						$fechaFin = $hoy;
						$tmp = split('-',$fechaFin);
						$anio = $tmp[0];
						$mes = $tmp[1];
						
						$ultimoDia = cal_days_in_month(CAL_GREGORIAN,$mes,$anio);
						$fechaFin = "$anio-$mes-$ultimoDia";
					}
					else					
						$fechaFin = $this->requestAction("clientes/getFechaFinContrato/$idCliente");

				}
				$this->data['Prestacion']['fecha_inicio'] = $hoy;
				$this->data['Prestacion']['fecha_fin'] = $fechaFin;
				$this->Prestacion->save($this->data['Prestacion']);//guarda la prestacion

				$this->requestAction("articulos/actualizarStock/$idServicio/$cantidad/");
				$this->set('status','Datos Guardados');
				unset($this->data['Prestacion']);				
			}
			else{
				if(!$admitido)
					$this->set('status', 'Existe faltante de articulos para realizar la prestacion.');
				elseif(!$permitidoExpurgue)
					$this->set('status', 'Existe faltante de cajas custodiadas para realizar dicho expurgue.');
					else
						$this->set('status', 'Existen errores con Prestacion.');
			}
			
			//seteamos la vista con ajax
			//$prestaciones = $this->listarUltimas(10);
			//$this->set('aPrestaciones',$prestaciones);
			$this->data['Prestacion']['cantidad'] = '';
			$this->render('add', 'ajax');
			
		}
		else{
			//$prestaciones = $this->listarUltimas(10);
			//$this->set('aPrestaciones',$prestaciones);
		}
	}
	
	function borrar(){
		$this->setLayout = false;
	}
	
	function modify ($id=null)
	{
		//setea la variables de errores y status
		$this->setearVariables();
		
		//setea los clientes
		$clientes = $this->requestAction('/clientes/seleccionarClientes');
		$this->set('clientes',$clientes);
		
		//setea los servicios brindados
		$serviciosBrindados = $this->requestAction('/servicios/seleccionarServiciosBrindados');
		$this->set('serviciosBrindados',$serviciosBrindados);

		
		//Carga el data para mostrar los datos.
		if (empty($this->data))  { 
			$this->Prestacion->id = $id;
			$this->data = $this->Prestacion->read();
		}
		//Aqui es cuando graba los datos.
		else 
		{ 
			 if ($this->Servicio->save($this->data['Prestacion']))
  			{
  				$this->flash('Datos Modificados','/prestacions/in2ex');
			}

		}
	}
	
	/**
	 * Funcion que elimina una prestacion
	 * @return dependiendo de $sTipo, si es JSON retorna un array en formato JSON
	 * 		   en caso contrario retorna un booleano.
	 * @param $iIdCliente integer
	 * @param $sTipo string
	 */
	function delete ($iIdPrestacion=null, $sTipo=null) {
		
		$aCrit =$_POST; 
		$aRetorno = array('estado'=>true, 
						  'mensaje'=>'');
		$bMesCerrado = false;
		
		if (empty($iIdPrestacion)) {

			//Extraigo del Config Ini las prestaciones de Expurgue y Custodia.
			$aServiciosIni = $this->getConfigIni('Servicios');
			$sServCustExp = $aServiciosIni['servicioCustodia'].','.$aServiciosIni['servicioExpurgue'];
			
			$sFecha = $this->convertDmyToYmd($aCrit['sFecha']);
			$iIdCliente = $aCrit['iIdCliente'];
			$iIdPrestacion = $aCrit['iIdPrestacion'];
			$bMesCerrado = $this->requestAction("historialprecios/mesCerrado/$iIdCliente/$sFecha/");
		}

		if (!$bMesCerrado) {
			//$aRetorno['estado'] = $this->Prestacion->execute("delete from prestacions where id = $iIdCliente");
			//pr($aRetorno['estado']);
			$aRetorno['estado'] = $this->Prestacion->del($iIdPrestacion);
			$aRetorno['mensaje']=($aRetorno['estado']==true)? "Prestacion $iIdPrestacion borrada." : "Error. Prestacion $iIdPrestacion no borrada.";
		}
		else {
			$aRetorno['estado']=false;
			$aRetorno['mensaje']= "El mes esta cerrado no se puede eliminar la prestacion: $iIdPrestacion";
		}

		if ($sTipo == 'JSON') {
			$this->layout = false;
			echo '['.json_encode($aRetorno).']';
		}
		else {
			return $aRetorno['estado'];			
		}

	}
	
	function autocomplete()
	{
		$filtro=$this->data['Cliente']['nombre'];
		$clientes = $this->requestAction("/clientes/listarClientes/$filtro");
		$this->set('clientes', $clientes);
		pr($clientes);
		$this->render('autocomplete'); 
	}	

	
	//FIN FUNCIONES PRINCIPALES//
	
	function setearVariables()
	{
		//seteamos las variables de error para ser mostradas en caso de no poder
		//guardar los datos
		
		//Mensaje de status q se muestra arriba de los datos.
		//$this->set('status', 'Ingrese los datos de una Prestacion');	
		$error = array 
		(
			'Prestacion/cantidad'=> 'Formato de cantidad incorrecto',
			'Prestacion/precio'=>'Formato del precio incorrecto.',
			'Prestacion/fecha_inicio'=> 'Formato de la fecha incorrecto',
			'Prestacion/fecha_fin'=> 'Formato de la fecha incorrecto'
		);

		$this->set('error',$error);
	}

	
	function setearSubMenu() {
		$aSubMenu[0]['title'] = 'Agregar';
		$aSubMenu[0]['href']	 = PATH . 'prestacions/add';
		$aSubMenu[0]['image']	 = '';

		$aSubMenu[1]['title'] = 'Listar';
		$aSubMenu[1]['href']	 = PATH . 'prestacions/';
		$aSubMenu[1]['image']	 = '';

		
		$this->set('aSubMenu', $aSubMenu);
	}
}
?>